﻿#pragma once
namespace LK
{
	namespace Reflection
	{
		struct PNamespaceNode:PDomainNode
		{
			PMETHODS(PNamespaceNode,NamespaceNode);
			/**
			@brief 构造一个命名空间*/
			PNamespaceNode(PString const& name, WeakPtr<PTypeLibrary> const& library = Convert<WeakPtr<PTypeLibrary> const&,PObject>::RefFrom(PObject()), PNamespaceNode const&baseNode = (PNamespaceNode const&)PLibraryNode::EmptyNode);
			/**
			@brief 获取类型节点数组*/
			Collection::PArray<PTypeNode> GetTypeNodeArray()const;
			/**
			@breif 查找当前节点下指定名称的命名空间节点，如果不存在则进行添加。
			@note 命名空间名称中如果包含分隔符，则进行子层查找和创建*/
			PNamespaceNode FindOrAddNamespace(PString const&path)const;
			/**
			@breif 在当前命名空间查找或添加指定的类型节点。
			@note 名称中如果包含分隔符，则进行子层查找或创建*/
			PTypeNode FindOrAddTypeNode(PString const&path,PType const&t=PType())const;
		};
		struct NamespaceNode:DomainNode
		{
			//通用方法
			BMETHODS(PNamespaceNode, NamespaceNode)
			/**
			@brief 构造命名空间*/
			NamespaceNode( PString const& name = PString::GetEmpty(), WeakPtr<PTypeLibrary> const& library=Convert<WeakPtr<PTypeLibrary> const&,PObject>::RefFrom(PObject()), PNamespaceNode const&baseNode = (PNamespaceNode const&)PLibraryNode::EmptyNode);
			/**
			@brief 获取类型节点数组*/
			Collection::PArray<PTypeNode> GetTypeNodeArray()const;
			/**
			@breif 查找当前节点下指定名称的命名空间节点，如果不存在则进行添加，返回引用。
			@note 命名空间名称中如果包含分隔符，则进行子层查找和创建*/
			PNamespaceNode FindOrAddNamespace(PString const&path);
			/**
			@breif 在当前命名空间查找或添加指定的类型节点。
			@note 名称中如果包含分隔符，则进行子层查找或创建*/
			PTypeNode FindOrAddTypeNode(PString const&path, PType const&t = PType());
		};
	}
}
